/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server.data;

import org.apache.log4j.Logger;

/**
 *
 * @author Administrator
 */
public class Queue {
private Logger logger = Logger.getLogger(Queue.class);
    private int aantalsleutels;
    private Knoop[] queue;

    public Queue(int _aantalsleutels, Knoop tab[]) {
        //er zit nix op index nul
        aantalsleutels = _aantalsleutels;
        queue = new Knoop[_aantalsleutels + 1];
        for(int i=0;i<_aantalsleutels;i++){
            queue[i+1]=tab[i];
        }

        for (int i = (_aantalsleutels+1) / 2; i > 0; i--) {
            /*if(i==0){
               System.out.println("boeee"); 
            }*/
            int j = i;
            while (2 * j <= _aantalsleutels && ((queue[j].getPrioriteit()) < queue[2 * j].getPrioriteit()) || ((2 * j + 1 <= _aantalsleutels) && (queue[j].getPrioriteit() < queue[2 * j + 1].getPrioriteit()))) {
                Knoop hulp = queue[j];
                int k;
                if ((2 * j + 1 <= _aantalsleutels) && (queue[2 * j + 1].getPrioriteit() > queue[2 * j].getPrioriteit())) {
                    k = 2 * j + 1;
                } else {
                    k = 2 * j;
                }
                queue[j] = queue[k];
                queue[k] = hulp;
                j = k;
            }
        }
    }

    public Knoop geefwortel() {
        return queue[1];
    }

    public void verwijderwortel() {
        vervangwortel(queue[aantalsleutels]);
        aantalsleutels--;
    }

    public void vervangwortel(Knoop _sl) {
        if (_sl.getPrioriteit() > queue[1].getPrioriteit()) {
            queue[1] = _sl;
        } else {
            int i = 1;
            while (2 * i <= aantalsleutels && (_sl.getPrioriteit() < queue[2 * i].getPrioriteit()) || ((2 * i + 1 <= aantalsleutels) && (_sl.getPrioriteit() < queue[2 * i + 1].getPrioriteit()))) {
                int k;
                if ((2 * i + 1 <= aantalsleutels) && (queue[2 * i + 1].getPrioriteit() > queue[2 * i].getPrioriteit())) {
                    k = 2 * i + 1;
                } else {
                    k = 2 * i;
                }
                queue[i] = queue[k];
                i = k;
            }
            queue[i] = _sl;
        }
    }

    public void voegToe(Knoop _sl) {
        aantalsleutels++;
        queue[aantalsleutels] = _sl;
        //herstel heapvoorwaarde
        int i = aantalsleutels;
        Knoop hulp;
        //zolang ouder kleiner is, wissel!
        //als we in de wortel zitten moeten we niet verder vergelijken
        while (i > 1 && queue[i].getPrioriteit() > queue[i / 2].getPrioriteit()) {
            hulp = queue[i];
            queue[i] = queue[i / 2];
            queue[i / 2] = hulp;
            i = i / 2;
        }

    }
    
    public void schrijf(){
        String s="";
        for(int i=1; i<=aantalsleutels; i++){
            s+=queue[i].getPrioriteit()+" - ";
        }
        logger.info(s);
    }
}
